﻿//#pragma once
//#include "XyNet/Common/FileSystem.h"
//#include "XyNet/Channel/RpcSocketChannel.h"
//#include "XyNet/Protocol/cpp/Rpc.pb.h"
//
//namespace XyNet
//{
//	class XYNET_API Uploader
//	{
//	public:
//		class XYNET_API Task : public enable_shared_from_this<Task>
//		{
//		public:
//			enum State
//			{
//				Prepare,    // 获取文件、目录、子目录信息
//				Pause,  // 暂停
//				Upload,   // 上传中
//				Finish  // 完成
//			};
//
//		public:
//			Task(weak_ptr<RpcChannel> channel,
//				const Bytes& serverLink, const FileSystem::Path& path);
//
//			/// 获取连接
//			const Bytes& getServerLink() const;
//			/// 获取连接
//			const Bytes& getClientLink() const;
//			/// 获取名称
//			const string& getName() const;
//			/// 获取路径
//			const FileSystem::Path& getUploadPath() const;
//
//			/// 更新
//			void update(function<void(shared_ptr<Task>)> callback);
//
//			/// 获取总尺寸
//			int64 getTotalSize() const;
//			/// 获取经过hash验证后需要上传的尺寸
//			int64 getNeedUploadSize() const;
//			/// 获取上传完成的尺寸
//			int64 getUploadedSize() const;
//
//			/// 获取状态
//			State getState() const;
//
//		private:
//			/// 通道
//			weak_ptr<RpcChannel> _channel;
//			/// 上传连接
//			Bytes _serverLink;
//			/// 上传连接
//			Bytes _clientLink;
//			/// 任务名
//			string _name;
//			/// 上传的路径（文件或文件夹）
//			FileSystem::Path _uploadPath;
//
//			/// 总尺寸
//			int64 _totalSize;
//			/// 经过hash验证后需要下载的尺寸
//			int64 _needUploadSize;
//			/// 下载完成的尺寸
//			int64 _uploadedSize;
//
//			/// 任务状态
//			State _state;
//		};
//
//	public:
//		Uploader(weak_ptr<RpcChannel> channel);
//
//		/// 创建任务
//		void createTask(const Bytes& serverLink, const FileSystem::Path& uploadPath);
//		/// 移除已完成的任务
//		void removeFinishedTasks();
//		/// 获取任务迭代器
//		ConstIterator<shared_ptr<Task>> getTasksIterator() const;
//
//		/// 获取路径连接（要设置路径预期类型，文件或是目录）
//		static Bytes getPathLink(const FileSystem::Path& path, bool isFile);
//
//	private:
//		/// 套接字通道
//		weak_ptr<RpcChannel> _channel;
//		/// 任务列表
//		vector<shared_ptr<Task>> _tasks;
//	};
//}